package com.ark.cloud.java.persistence.utils;

import com.alibaba.fastjson.JSONArray;
import com.ark.cloud.java.persistence.entity.*;

import java.text.SimpleDateFormat;
import java.util.Date;

public  class KafkaAnalysisUtils {

    /**
     * @description: 去除字符串尾部\0
     * @param: [string]
     * @return: java.lang.String
     * @author YueXQ
     * @date: 2021/11/27 10:29
     **/
    public  static String filterCode(String string) {
        if (string != null) {
            string = string.trim();
            byte[] zero = new byte[1];
            zero[0] = (byte) 0;
            String s = new String(zero);
            string = string.replaceAll(s, "");
        }
        return string;
    }


//平台数据(PlatState)
    public static PlatState analysisPlatState(byte[] platStateArr){
        PlatState platState = new PlatState();
        byte[] timeStampArr = ByteUtils.splitArray(platStateArr, 0, 22);

        byte[] idArr = ByteUtils.splitArray(platStateArr, 22, 37);

        byte[] array = ByteUtils.splitArray(platStateArr, 59, 4);
        int dbId = ByteUtils.byteToInt(array);
        byte[] nameArr = ByteUtils.splitArray(platStateArr, 63, 64);
        byte[] typeArr = ByteUtils.splitArray(platStateArr, 127, 14);
        EntityType type = analysisEntityType(typeArr);
        byte[] sideIdArr = ByteUtils.splitArray(platStateArr, 141, 37);
        //short
        byte[] shortBytes = ByteUtils.splitArray(platStateArr, 178, 2);
        short sidePosture =ByteUtils.byteToShort(shortBytes) ;

        byte[] vec3DArr = ByteUtils.splitArray(platStateArr, 180, 24);

        Vec3D vec3D = analysisVec3D(vec3DArr);
        System.out.println("vec3D:"+vec3D);

        byte[] eulerAngleArr = ByteUtils.splitArray(platStateArr, 204, 24);
        EulerAngle eulerAngle = analysisEulerAngle(eulerAngleArr);
        byte[]vec3FBytes = ByteUtils.splitArray(platStateArr, 228, 12);
        Vec3F vec3F = analysisVec3F(vec3FBytes);
        float damaged = ByteUtils.byteToFloat(new byte[]{platStateArr[240], platStateArr[241], platStateArr[242], platStateArr[243]});

        byte[] bytes = ByteUtils.splitArray(platStateArr, 244, 8);
        char[] chars = ByteUtils.byteArrayToCharArray(bytes);
//        platState.setId(ByteUtils.byteArrayToCharArrayToString(idArr));
        platState.setId(filterCode(ByteUtils.byteArrayToCharArrayToString(idArr)));

        platState.setDbid(dbId);

        String gbkName = ByteUtils.byteArrayToCharArrayToStringGBK(nameArr);
//        platState.setName(gbkName);
        platState.setName(filterCode(gbkName));

        platState.setType(type);
//        platState.setSideId(ByteUtils.byteArrayToCharArrayToString(sideIdArr));

        platState.setSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArr)));
        platState.setSidePosture(sidePosture);


        platState.setTimestamp(dateTOString(timeStampArr));

        platState.setPos(vec3D);
//        platState.setEulerAngle(JSONArray.toJSONString(eulerAngle));
        platState.setOri(eulerAngle);
        platState.setVel(vec3F);
        platState.setDamaged(damaged);
        platState.setCustomid(ByteUtils.char2String(chars));

        return platState;

    }

//    传感器数据(SensorData)
// beams  没写
    public static SensorData analysisSensorData(byte[] bytes) {
        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] idArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] dbIdArray = ByteUtils.splitArray(bytes, 59, 4);
        byte[] nameArray = ByteUtils.splitArray(bytes, 63, 64);
        byte[] hostIdArray = ByteUtils.splitArray(bytes, 127, 37);
        byte[] damagedArray = ByteUtils.splitArray(bytes, 164, 4);
        byte[] numberArray = ByteUtils.splitArray(bytes, 168, 2);

//        转换下时间格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s = filterCode(ByteUtils.byteArrayToCharArrayToString(timestampArray));
        String b = null;
        try {
            Date date = simpleDateFormat.parse(s);
            b = simpleDateFormat.format(date);

            System.out.println("时间："+b);
        } catch (Exception e) {
            e.printStackTrace();
        }


        SensorData build = SensorData.builder()
                .timestamp(b)
//                .id(ByteUtils.byteArrayToCharArrayToString(idArray))
                .id(filterCode(ByteUtils.byteArrayToCharArrayToString(idArray)))
                .dbId(ByteUtils.byteToInt(dbIdArray))
//                .name(ByteUtils.byteArrayToCharArrayToStringGBK(nameArray))
                .name(filterCode(ByteUtils.byteArrayToCharArrayToStringGBK(nameArray)))
//                .hostId(ByteUtils.byteArrayToCharArrayToString(hostIdArray))
                .hostId(filterCode(ByteUtils.byteArrayToCharArrayToString(hostIdArray)))
                .damaged(ByteUtils.byteToFloat(damagedArray))
                .emitterNumber( ByteUtils.byteToShort(numberArray)).build();
        return build;
    }


//   3 ScenarioState

    public static ScenarioState analysisScenarioState22(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);

        ScenarioState scenarioState = new ScenarioState();
        scenarioState.setTimestamp(filterCode(ByteUtils.byteArrayToCharArrayToString(timestampArray)));

        return scenarioState;
    }

//   4 ContactState
//  recordList  没写
public static ContactState analysisContactState(byte[] contactStateArr) {

    ContactState contactState = new ContactState();
    byte[] timestampArray = ByteUtils.splitArray(contactStateArr, 0, 22);


    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String s = filterCode(ByteUtils.byteArrayToCharArrayToString(timestampArray));
    String b = null;
    try {
        Date date = simpleDateFormat.parse(s);
        b = simpleDateFormat.format(date);

        System.out.println("ContactState 时间："+b);
    } catch (Exception e) {
        e.printStackTrace();
    }
    contactState.setTimestamp(b);

    byte[] idArray = ByteUtils.splitArray(contactStateArr, 22, 37);
    contactState.setId(ByteUtils.byteArrayToCharArrayToString(idArray));

    byte[] nameArray = ByteUtils.splitArray(contactStateArr, 59, 64);
    contactState.setName(ByteUtils.byteArrayToCharArrayToStringGBK(nameArray));
    short identificationStatus = ByteUtils.byteToShort(new byte[]{contactStateArr[123], contactStateArr[124]});
    contactState.setStatus(identificationStatus);

    byte[] detectingSideIdArray = ByteUtils.splitArray(contactStateArr, 125, 37);
    contactState.setDetectingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(detectingSideIdArray)));
    int knowSide = ByteUtils.byteToUnsignedInt(contactStateArr[162]);
    contactState.setKnowSide(knowSide==1 ? true : false);
    int knowSpeed = ByteUtils.byteToUnsignedInt(contactStateArr[163]);
    contactState.setKnowSpeed(knowSpeed==1 ? true : false);
    int knownHeading = ByteUtils.byteToUnsignedInt(contactStateArr[164]);
    contactState.setKnownHeading(knownHeading==1 ? true : false);
    int knowAlt = ByteUtils.byteToUnsignedInt(contactStateArr[165]);
    contactState.setKnowAlt(knowAlt==1 ? true : false);
    byte[] realUnitIdArray = ByteUtils.splitArray(contactStateArr, 166, 37);
    contactState.setRealUnitId(filterCode((ByteUtils.byteArrayToCharArrayToString(realUnitIdArray))));
    byte[] sideIdArray = ByteUtils.splitArray(contactStateArr, 203, 37);
    contactState.setSideId(ByteUtils.byteArrayToCharArrayToString(sideIdArray));
    short type = ByteUtils.byteToShort(new byte[]{contactStateArr[240], contactStateArr[239]});
    contactState.setType(type);
    byte[] lonArray = ByteUtils.splitArray(contactStateArr, 242, 8);
    double lon = ByteUtils.getDouble(lonArray);
    contactState.setLon(lon);
    byte[] latArray = ByteUtils.splitArray(contactStateArr, 250, 8);
    double lat = ByteUtils.getDouble(latArray);
    contactState.setLat(lat);
    byte[] altArray = ByteUtils.splitArray(contactStateArr, 252, 4);
    float alt = ByteUtils.byteToFloat(altArray);
    contactState.setAlt(alt);
    byte[] headingArray = ByteUtils.splitArray(contactStateArr, 262, 4);
    float heading = ByteUtils.byteToFloat(headingArray);
    contactState.setHeading(heading);
    byte[] speedArray = ByteUtils.splitArray(contactStateArr, 266, 4);
    float speed = ByteUtils.byteToFloat(speedArray);
    contactState.setSpeed(speed);
    byte[] countArray = ByteUtils.splitArray(contactStateArr, 270, 4);
    int count = ByteUtils.byteToInt(countArray);
    contactState.setRecordCount(count);

    return contactState;
}

    public static DetectingRecord analysisRecordList(byte[] recordBytes) {
        byte[] timeArrays = ByteUtils.splitArray(recordBytes, 0, 22);
        byte[] typeArray = ByteUtils.splitArray(recordBytes, 22, 2);
        byte[] countArray = ByteUtils.splitArray(recordBytes, 24, 4);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s = filterCode(ByteUtils.byteArrayToCharArrayToString(timeArrays));
        String b = null;
        try {
            Date date = simpleDateFormat.parse(s);
            b = simpleDateFormat.format(date);

            System.out.println("ContactState 时间："+b);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return DetectingRecord.builder()
                .timestamp(b)
                .generateType(ByteUtils.byteToShort(typeArray))
                .sensorCount(ByteUtils.bytesArrayToIntLittle(countArray,0))
                .build();
    }


    public static  SensorInfo analysisSensorList(byte[] sensorByte) {
        byte[] idArray = ByteUtils.splitArray(sensorByte, 0, 37);
        byte[] dbIdArray = ByteUtils.splitArray(sensorByte, 37, 4);
        byte[] typeArray = ByteUtils.splitArray(sensorByte, 41, 2);
        return SensorInfo.builder()
                .id(ByteUtils.byteArrayToCharArrayToString(idArray))
                .dbid(ByteUtils.byteToInt(dbIdArray))
                .sensorType(ByteUtils.byteToShort(typeArray))
                .build();
    }

//   5 FireEvent
    public static FireEvent analysisFireEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] firingIdArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] targetIdArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes, 96, 37);

        byte[] munitionTypeArray = ByteUtils.splitArray(bytes, 133, 14);
        EntityType entityType = analysisEntityType(munitionTypeArray);


        String s = dateTOString(timestampArray);
        FireEvent build = FireEvent.builder()
                .timestamp(s)
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .build();

        return build;
    }


    //6  ExplodeEvent
    public static ExplodeEvent analysisExplodeEvent(byte[] explodeEventByte) {

        byte[] timestampArray = ByteUtils.splitArray(explodeEventByte, 0, 22);

        byte[] firingIdArray = ByteUtils.splitArray(explodeEventByte, 22, 37);
        byte[] targetIdArray = ByteUtils.splitArray(explodeEventByte, 59, 37);
        byte[] munitionIdArray = ByteUtils.splitArray(explodeEventByte, 96, 37);

        byte[] posArray = ByteUtils.splitArray(explodeEventByte, 133, 24);
        Vec3D vec3D = analysisVec3D(posArray);

        String s = dateTOString(timestampArray);
        ExplodeEvent build = ExplodeEvent.builder()
                .timestamp(s)
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .pos(vec3D)
                .build();

        return build;
    }

//    时间转换
    public static String dateTOString(byte[] timestampArray){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s = filterCode(ByteUtils.byteArrayToCharArrayToString(timestampArray));
        String b = null;
        try {
            Date date = simpleDateFormat.parse(s);
            System.out.println("转化的 date:"+date);
            b = simpleDateFormat.format(date);


            System.out.println("ContactState 时间："+b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return b;

    }

// 7   DetectEvent
    public static DetectEvent analysisDetectEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);

        byte[] idArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] targetIdArray = ByteUtils.splitArray(bytes, 59, 37);//96


        DetectEvent build = DetectEvent.builder()
                .timestamp(dateTOString(timestampArray))
                .id(ByteUtils.byteArrayToCharArrayToString(idArray))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))

                .build();
        return build;
    }

//    bgcmd_head
    public static BGCMDHEAD analysisBGCMDHEAD(byte[] bytes) {

        byte[] timeArray =  ByteUtils.splitArray(bytes, 0, 22);
        byte[] szSaltIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] szSaltNameArray = ByteUtils.splitArray(bytes, 59, 64);
        byte[] szSideIDArray = ByteUtils.splitArray(bytes, 123, 37);

        byte[] senderArray = ByteUtils.splitArray(bytes, 160, 2);
        byte[] nParamNumArray = ByteUtils.splitArray(bytes, 162,4);//166

        BGCMDHEAD build = BGCMDHEAD.builder()
                .timestamp(dateTOString(timeArray))
                .szSaltID(ByteUtils.byteArrayToCharArrayToString(szSaltIDArray))
                .szSaltName(ByteUtils.byteArrayToCharArrayToString(szSaltNameArray))
                .szSideID(ByteUtils.byteArrayToCharArrayToString(szSideIDArray))
                .sender(ByteUtils.byteToShort(senderArray))
                .nParamNum(ByteUtils.byteToInt(nParamNumArray))

                .build();
        return build;
    }

//     BGParam
public static BGParam analysisBGParam(byte[] bytes) {

    byte[] timeArray =  ByteUtils.splitArray(bytes, 0, 22);
    byte[] dXArray = ByteUtils.splitArray(bytes, 22, 8);
    byte[] dYArray = ByteUtils.splitArray(bytes,30, 8);
    byte[] dZArray = ByteUtils.splitArray(bytes,38, 8);
    byte[] dSmaArray = ByteUtils.splitArray(bytes,46, 8);
    byte[] dEccArray = ByteUtils.splitArray(bytes,54, 8);
    byte[] dIncArray = ByteUtils.splitArray(bytes,62, 8);
    byte[] dRaanArray = ByteUtils.splitArray(bytes,70, 8);
    byte[] dAopArray = ByteUtils.splitArray(bytes,78, 8);
    byte[] dTaArray = ByteUtils.splitArray(bytes,86, 8);//94

    BGParam build = BGParam.builder()
            .timestamp(dateTOString(timeArray))
            .dX(ByteUtils.getDouble(dXArray))
            .dY(ByteUtils.getDouble(dYArray))
            .dZ(ByteUtils.getDouble(dZArray))
            .dSma(ByteUtils.getDouble(dSmaArray))
            .dEcc(ByteUtils.getDouble(dEccArray))
            .dInc(ByteUtils.getDouble(dIncArray))
            .dRaan(ByteUtils.getDouble(dRaanArray))
            .dAop(ByteUtils.getDouble(dAopArray))
            .dTa(ByteUtils.getDouble(dTaArray))


            .build();
    return build;
}


//  9  SensorOnOffEvent
    public static SensorOnOffEvent analysisSensorOnOffEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);

        byte[]  sensorIdArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[]  platformIdArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] sideIdArray = ByteUtils.splitArray(bytes, 96, 37);

        byte[] onArray = ByteUtils.splitArray(bytes, 133, 1);
        byte[] senderArray = ByteUtils.splitArray(bytes, 134, 2);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 136, 37);

        boolean b = onArray[0] == 1 ? true : false;

        String s = dateTOString(timestampArray);

        SensorOnOffEvent build = SensorOnOffEvent.builder()
                .timestamp(s)
                .sensorId(filterCode(ByteUtils.byteArrayToCharArrayToString(sensorIdArray)))
                .platformId(filterCode(ByteUtils.byteArrayToCharArrayToString(platformIdArray)))
                .sideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArray)))
                .on(b)
                .sender(ByteUtils.byteToShort(senderArray))
                .cmdID(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))

                .build();
        return build;
    }


//    10  CommunicationEvent
    public static CommunicationEvent analysisCommunicationEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);

        byte[]  senderIdArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[]  receiverIdArray = ByteUtils.splitArray(bytes, 59, 37);

        byte[] comflagArray = ByteUtils.splitArray(bytes, 96, 1);
        byte[] typeArray = ByteUtils.splitArray(bytes, 97,4);

        boolean b = comflagArray[0] == 1 ? true : false;

        String s = dateTOString(timestampArray);
        CommunicationEvent build = CommunicationEvent.builder()
                .timestamp(s)
                .senderId(filterCode(ByteUtils.byteArrayToCharArrayToString(senderIdArray)))
                .receiverId(filterCode(ByteUtils.byteArrayToCharArrayToString(receiverIdArray)))
                .comFlag(b)
                .type(ByteUtils.byteToInt(typeArray))

                .build();
        return build;
    }

//  11  DestoryEvent
    public static DestoryEvent analysisDestoryEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] idArray = ByteUtils.splitArray(bytes, 22, 37);

        DestoryEvent build = DestoryEvent.builder()
                .timestamp(dateTOString(timestampArray))
                .Id(filterCode(ByteUtils.byteArrayToCharArrayToString(idArray)))
                .build();
        return build;
    }

    //12 JammerEvent
//jammerEntIdList  没写

    public static JammerEvent analysisJammerEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] typeArray  = ByteUtils.splitArray(bytes, 22, 2);
        byte[] startArray  = ByteUtils.splitArray(bytes, 24,1);
        byte[] jammeredEntIdArray  = ByteUtils.splitArray(bytes, 25,37);

        byte[] platNumArray  = ByteUtils.splitArray(bytes, 62,4);

        boolean b = startArray[0] == 1 ? true : false;

        JammerEvent build = JammerEvent.builder()
                .timeStamp(dateTOString(timestampArray))
                .type(ByteUtils.byteToShort(typeArray))
                .start(b)
                .jammeredEntId(filterCode(ByteUtils.byteArrayToCharArrayToString(jammeredEntIdArray)))
                .platNum( ByteUtils.byteToInt(platNumArray))

                .build();
        return build;
    }


    //13  SimEngineState
    public static SimEngineState analysisSimEngineState(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] typeArray  = ByteUtils.splitArray(bytes, 22, 2);
        byte[] changedRateArray  = ByteUtils.splitArray(bytes, 24,2);
        byte[] jumpToArray  = ByteUtils.splitArray(bytes, 26,22);
        byte[] jumOffsetArray  = ByteUtils.splitArray(bytes,48,8);
        byte[] simModeArray  = ByteUtils.splitArray(bytes,56,2);

        String s = dateTOString(timestampArray);
        SimEngineState build = SimEngineState.builder()
                .timestamp(s)
                .type(ByteUtils.byteToShort(typeArray))
                .changedRate(ByteUtils.byteToShort(changedRateArray))
                .jumpTo( dateTOString(jumpToArray))
                .jumOffset(ByteUtils.getDouble(jumOffsetArray))
                .simMode(ByteUtils.byteToShort(simModeArray))

                .build();
        return build;
    }


    //14  AircraftStatus
    public static AircraftStatus analysisAircraftStatus(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] idArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] lastStatusArray  = ByteUtils.splitArray(bytes, 59, 2);
        byte[] curStatusArray  = ByteUtils.splitArray(bytes, 61,2);


        String s = dateTOString(timestampArray);
        AircraftStatus build = AircraftStatus.builder()
                .timestamp(s)
                .entityId(filterCode(ByteUtils.byteArrayToCharArrayToString(idArray)))
                .lastStatus(ByteUtils.byteToShort(lastStatusArray))
                .curStatus(ByteUtils.byteToShort(curStatusArray))

                .build();
        return build;
    }


    // 15  ReplyCmd
    public static ReplyCmd analysisReplyCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22, 37);

        String s = dateTOString(timestampArray);

        ReplyCmd build = ReplyCmd.builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .build();
        return build;
    }

    // 16  AircraftLaunchCmd
    public static AircraftLaunchCmd analysisAircraftLaunchCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] aircraftIdArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] baseIdArray = ByteUtils.splitArray(bytes, 96, 37);
        byte[] takeoffArray = ByteUtils.splitArray(bytes,133, 1);

       boolean b =  takeoffArray[0] == 1 ? true : false;

        String s = dateTOString(timestampArray);
        AircraftLaunchCmd build = AircraftLaunchCmd.builder()
                .timestamp(s)
                .cmdID(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .aircraftId(filterCode(ByteUtils.byteArrayToCharArrayToString(aircraftIdArray)))
                .baseId(filterCode(ByteUtils.byteArrayToCharArrayToString(baseIdArray)))
                .takeoff(b)
                .build();
        return build;
    }

    // 17  SpeedCmd 速度控制指令
    public static SpeedCmd analysisSpeedCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] unitIdArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] speedArray = ByteUtils.splitArray(bytes, 96,4);


        String s = dateTOString(timestampArray);
        SpeedCmd build = SpeedCmd.builder()
                .timestamp(s)
                .cmdID(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .unitId(filterCode(ByteUtils.byteArrayToCharArrayToString(unitIdArray)))
                .speed(ByteUtils.byteToFloat(speedArray))

                .build();
        return build;
    }

    // 18  WaypointCmd 航线指令
    public static WaypointCmd analysisWaypointCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] unitIdArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] countArray = ByteUtils.splitArray(bytes, 96,2);


        String s = dateTOString(timestampArray);
        WaypointCmd build = WaypointCmd.builder()
                .timestamp(s)
                .cmdID(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .unitId(filterCode(ByteUtils.byteArrayToCharArrayToString(unitIdArray)))
                .count(ByteUtils.byteToShort(countArray))
                .build();
        return build;
    }

    // 19  JammerCmd 干扰指令
    public static JammerCmd analysisJammerCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59, 2);
        byte[] cmdUnitIdArray = ByteUtils.splitArray(bytes,61,37);
        byte[] jammerIdArray = ByteUtils.splitArray(bytes,98,37);
        byte[] contactIdArray = ByteUtils.splitArray(bytes,135,37);

        byte[] beginTimeArray = ByteUtils.splitArray(bytes,157,22);
        byte[] endTimeArray = ByteUtils.splitArray(bytes,179,22);
        String s = dateTOString(beginTimeArray);
        String s1 = dateTOString(endTimeArray);
        JammerCmd build = JammerCmd.builder()
                .timestamp(dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .cmdUnitId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdUnitIdArray)))
                .jammerId(filterCode(ByteUtils.byteArrayToCharArrayToString(jammerIdArray)))
                .contactId(filterCode(ByteUtils.byteArrayToCharArrayToString(contactIdArray)))
                .beginTime(s)
                .endTime(s1)
                .build();
        return build;
    }


    // 20  GuideCmd 引导指令
//    guidedUnitList 没写
    public static GuideCmd analysisGuideCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59, 2);
        byte[] cmdUnitIdArray = ByteUtils.splitArray(bytes,61,37);
        byte[] execUnitIdArray = ByteUtils.splitArray(bytes,98,37);

        byte[] beginTimeArray = ByteUtils.splitArray(bytes,135,22);
        byte[] endTimeArray = ByteUtils.splitArray(bytes,157,22);
        byte [] guidedUnitCountArray =  ByteUtils.splitArray(bytes,179,2);

        String s = dateTOString(timestampArray);
        GuideCmd build = GuideCmd.builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .cmdUnitId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdUnitIdArray)))
                .execUnitId(filterCode(ByteUtils.byteArrayToCharArrayToString(execUnitIdArray)))
                .beginTime(dateTOString(beginTimeArray))
                .endTime(dateTOString(endTimeArray))
                .guidedUnitCount(ByteUtils.byteToShort(guidedUnitCountArray))
                .build();
        return build;
    }

    // 21  LuaCmd
//
    public static LuaCmd analysisLuaCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] cmdArray = ByteUtils.splitArray(bytes, 59, 1);
        byte[] senderArray = ByteUtils.splitArray(bytes,60,1);
        byte[] exeTimeArray = ByteUtils.splitArray(bytes,61,22);
        byte[] exeMinutesArray = ByteUtils.splitArray(bytes,83,8);


        String s = dateTOString(timestampArray);
        String s1 = dateTOString(exeTimeArray);
        LuaCmd build = LuaCmd.builder()
                .timeStamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .cmd(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdArray)))
                .sender(filterCode(ByteUtils.byteArrayToCharArrayToString(senderArray)))
                .exeTime(s1)
                .exeMinutes(ByteUtils.getDouble(exeMinutesArray))

                .build();
        return build;
    }


    // 22  LuaCmdReply
//
    public static LuaCmdReply analysisLuaCmdReply(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] succeedArray = ByteUtils.splitArray(bytes, 59, 1);
        byte[] errorArray = ByteUtils.splitArray(bytes,60,1);

        boolean b = succeedArray[0]== 1 ? true : false;

        String s = dateTOString(timestampArray);
        LuaCmdReply build = LuaCmdReply.builder()
                .timeStamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .succeed(b)
                .error(filterCode(ByteUtils.byteArrayToCharArrayToString(errorArray)))

                .build();
        return build;
    }


    // 23  ReconnoiterCmd  侦察指令
//vector<Vec3D>    areaList; 没写
    public static ReconnoiterCmd analysisReconnoiterCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59, 2);

        byte[] cmdUnitIdArray = ByteUtils.splitArray(bytes,61,37);
        byte[] ReconnoiterIdArray = ByteUtils.splitArray(bytes,98,37);

        byte[] beginTimeArray = ByteUtils.splitArray(bytes,135,22);
        byte[] endTimeArray = ByteUtils.splitArray(bytes,157,22);
        byte[] turnOnWhenBeginArray = ByteUtils.splitArray(bytes,179,1);
        byte[] countArray = ByteUtils.splitArray(bytes,180,2);

        boolean b = turnOnWhenBeginArray[0]== 1 ? true : false;

        ReconnoiterCmd build = ReconnoiterCmd.builder()
                .timestamp( dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIDArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .cmdUnitId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdUnitIdArray)))
                .ReconnoiterId(filterCode(ByteUtils.byteArrayToCharArrayToString(ReconnoiterIdArray)))
                .beginTime(dateTOString(beginTimeArray) )
                .endTime(dateTOString(endTimeArray) )
                .turnOnWhenBegin(b)

                .count(ByteUtils.byteToShort(countArray))

                .build();
        return build;
    }


    // 24  ScenarioData

    public static ScenarioData analysisScenarioData(byte[] bytes) {

        byte[] scenarioHeadArray = ByteUtils.splitArray(bytes,0, 27);

        ScenarioHead scenarioHead = analysisScenarioHead(scenarioHeadArray);
        byte[] pFileDataBufArray = ByteUtils.splitArray(bytes,27, 1);


        ScenarioData build = ScenarioData.builder()
                .scenarioHead(scenarioHead)
                .pFileDataBuf(filterCode(ByteUtils.byteArrayToCharArrayToString(pFileDataBufArray)))
                .build();

        return build;
    }

//    _ScenarioHead
    public static ScenarioHead analysisScenarioHead(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] FileNameArray = ByteUtils.splitArray(bytes, 22, 1);

        byte[] FileSizeArray = ByteUtils.splitArray(bytes, 23,4);


        ScenarioHead build = ScenarioHead.builder()
                .timestamp( dateTOString(timestampArray))
                .FileName(filterCode(ByteUtils.byteArrayToCharArrayToString(FileNameArray)))
                .FileSize(ByteUtils.byteToInt(FileSizeArray))

                .build();
        return build;
    }

//   25  SatOrbit
    public static SatOrbit analysisSatOrbit(byte[] bytes) {
        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] saltIDArray = ByteUtils.splitArray(bytes, 22, 37);
        byte[] sideIDArray = ByteUtils.splitArray(bytes, 59, 37);
        byte[] propTypeArray = ByteUtils.splitArray(bytes, 96, 4);
        byte[] coordTypeArray = ByteUtils.splitArray(bytes, 100, 4);
        byte[] menuverArray = ByteUtils.splitArray(bytes, 104, 22);
        byte[] xArray = ByteUtils.splitArray(bytes, 126, 8);
        byte[] yArray = ByteUtils.splitArray(bytes, 134, 8);
        byte[] zArray = ByteUtils.splitArray(bytes, 142, 8);
        byte[] vxArray = ByteUtils.splitArray(bytes, 150, 8);
        byte[] vyArray = ByteUtils.splitArray(bytes, 158, 8);
        byte[] vzArray = ByteUtils.splitArray(bytes, 166, 8);
        byte[] sma = ByteUtils.splitArray(bytes, 174, 8);
        byte[] ecc = ByteUtils.splitArray(bytes, 182, 8);
        byte[] inc = ByteUtils.splitArray(bytes, 190, 8);
        byte[] raan = ByteUtils.splitArray(bytes, 198, 8);
        byte[] aop = ByteUtils.splitArray(bytes, 206, 8);
        byte[] ma = ByteUtils.splitArray(bytes, 214, 8);


        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s = filterCode(ByteUtils.byteArrayToCharArrayToString(timestampArray));
        String b = null;
        try {
            Date date = simpleDateFormat.parse(s);
            b = simpleDateFormat.format(date);

            System.out.println(" 时间："+b);
        } catch (Exception e) {
            e.printStackTrace();
        }

        String s2 = filterCode(ByteUtils.byteArrayToCharArrayToString(menuverArray));
        String b2 = null;
        try {
            Date date = simpleDateFormat.parse(s2);
            b2 = simpleDateFormat.format(date);

            System.out.println(" 时间："+b2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return SatOrbit.builder()
//                .id(ByteUtils.byteArrayToCharArrayToString(saltIDArray))
//                .id(filterCode(ByteUtils.byteArrayToCharArrayToString(saltIDArray)))
//                .timestamp(ByteUtils.byteArrayToCharArrayToString(timestampArray))
                .timestamp(b)
//                .szSideId(ByteUtils.byteArrayToCharArrayToString(sideIDArray))
                .szSaltID(filterCode(ByteUtils.byteArrayToCharArrayToString(saltIDArray)))
                .szSideID(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIDArray)))
                .propType(ByteUtils.byteToInt(propTypeArray))
                .coordType(ByteUtils.byteToInt(coordTypeArray))
//                .menuverTime(ByteUtils.byteArrayToCharArrayToString(menuverArray))
                .menuverTime(b2)
                .x(ByteUtils.getDouble(xArray))
                .y(ByteUtils.getDouble(yArray))
                .z(ByteUtils.getDouble(zArray))
                .vx(ByteUtils.getDouble(vxArray))
                .vy(ByteUtils.getDouble(vyArray))
                .vz(ByteUtils.getDouble(vzArray))
                .sma(ByteUtils.getDouble(sma))
                .ecc(ByteUtils.getDouble(ecc))
                .inc(ByteUtils.getDouble(inc))
                .raan(ByteUtils.getDouble(raan))
                .aop(ByteUtils.getDouble(aop))
                .ma(ByteUtils.getDouble(ma))
                .build();
    }
    //E_WeaponDNEndEvent = 26,
    //E_JGWeaponEndEvent = 27,



    //  28  FireJGCmd
    public static FireJGCmd analysisFireJGCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59,2);
        byte[] sideIdArray = ByteUtils.splitArray(bytes, 61,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes, 98,37);
        byte[] targetIdArray = ByteUtils.splitArray(bytes, 135,37);
        byte[] weaponDBIDArray = ByteUtils.splitArray(bytes, 172,4);
        byte[] estimatedFiringTimeArray = ByteUtils.splitArray(bytes,176,22);
        byte[] attackTimeArray = ByteUtils.splitArray(bytes,198,8);
        byte[] arrivalPowerDensityArray = ByteUtils.splitArray(bytes,206,8);

        FireJGCmd build = FireJGCmd.builder()
                .timestamp( dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .sideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .weaponDBID(ByteUtils.byteToInt(weaponDBIDArray))
                .estimatedFiringTime( dateTOString(estimatedFiringTimeArray))
                .attackTime(ByteUtils.getDouble(attackTimeArray))
                .arrivalPowerDensity(ByteUtils.getDouble(arrivalPowerDensityArray))

                .build();
        return build;

    }

    //  29  FireDNCmd
    public static FireDNCmd analysisFireDNCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59,2);
        byte[] sideIdArray = ByteUtils.splitArray(bytes, 61,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes, 98,37);
        byte[] targetIdArray = ByteUtils.splitArray(bytes, 135,37);
        byte[] weaponDBIDArray = ByteUtils.splitArray(bytes, 172,4);
        byte[] estimatedFiringTimeArray = ByteUtils.splitArray(bytes,176,22);
        byte[] interceptTimeArray = ByteUtils.splitArray(bytes,198,22);

        byte[] interceptRVArray = ByteUtils.splitArray(bytes,220,8);

       FireDNCmd build = FireDNCmd.builder()
                .timestamp(dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .sideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .weaponDBID(ByteUtils.byteToInt(weaponDBIDArray))
                .estimatedfiringTime( dateTOString(estimatedFiringTimeArray))
                .interceptTime(dateTOString(interceptTimeArray))
                .interceptRV(ByteUtils.byteArray2DoubleArray(interceptRVArray))

                .build();
        return build;
    }


    //  30  FireCKCmd
    public static FireCKCmd analysisFireCKCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] typeArray = ByteUtils.splitArray(bytes, 59,2);
        byte[] sideIdArray = ByteUtils.splitArray(bytes, 61,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes, 98,37);
        byte[] targetIdArray = ByteUtils.splitArray(bytes, 135,37);
        byte[] weaponDBIDArray = ByteUtils.splitArray(bytes, 172,4);

        FireCKCmd build = FireCKCmd.builder()
                .timestamp( dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .type(ByteUtils.byteToShort(typeArray))
                .sideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .weaponDBID(ByteUtils.byteToInt(weaponDBIDArray))

                .build();
        return build;
    }

    //  31  SatelliteCmd
    public static SatelliteCmd analysisSatelliteCmd(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] satIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] sideIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] impulseArray = ByteUtils.splitArray(bytes, 133,720);
        byte[] formationModeArray = ByteUtils.splitArray(bytes,853,4);
        byte[] formationParaArray = ByteUtils.splitArray(bytes, 857,80);

        SatelliteCmd build = SatelliteCmd.builder()
                .timestamp(dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .satId(filterCode(ByteUtils.byteArrayToCharArrayToString(satIdArray)))
                .sideId(filterCode(ByteUtils.byteArrayToCharArrayToString(sideIdArray)))
                .impulse(ByteUtils.byteArray2DoubleArray2(impulseArray,10,9))
                .formationMode(ByteUtils.byteToInt(formationModeArray))
                .formationPara(ByteUtils.byteArray2DoubleArray(formationParaArray))

                .build();
        return build;
    }

    // 32  FireJGEvent
    public static FireJGEvent analysisFireJGEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);

        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);

        byte[] attackTimeArray = ByteUtils.splitArray(bytes,221,8);

        byte[] arrivalPowerDensityArray = ByteUtils.splitArray(bytes, 229,8);//237

        String s = dateTOString(timestampArray);
        FireJGEvent build = FireJGEvent.builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .attackTime(ByteUtils.getDouble(attackTimeArray))
                .arrivalPowerDensity(ByteUtils.getDouble(arrivalPowerDensityArray))

                .build();
        return build;
    }


    // 33  FireDNEvent
    public static FireDNEvent analysisFireDNEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);

        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);

        byte[] SBITypeArray = ByteUtils.splitArray(bytes, 221,2);

        String s = dateTOString(timestampArray);
        FireDNEvent build = FireDNEvent.builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .SBIType(ByteUtils.byteToShort(SBITypeArray))

                .build();
        return build;
    }

    // 34   FireCKEvent
    public static FireCKEvent analysisFireCKEvent(byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);

        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);


        FireCKEvent build = FireCKEvent.builder()
                .timestamp(dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)

                .build();
        return build;
    }


    // 35   EndGameJGEvent
    public static EndGameJGEvent  analysisEndGameJGEvent (byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);
        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);

        byte[] resultArray = ByteUtils.splitArray(bytes,221,2);
        byte[] attackDuringArray = ByteUtils.splitArray(bytes,223,8);
        byte[] powerDensityArray = ByteUtils.splitArray(bytes,231,8);//239


        String s = dateTOString(timestampArray);
        EndGameJGEvent  build = EndGameJGEvent .builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .result(ByteUtils.byteToShort(resultArray))
                .attackDuring(ByteUtils.getDouble(attackDuringArray))
                .powerDensity(ByteUtils.getDouble(powerDensityArray))

                .build();
        return build;
    }



    // 36  EndGameDNEvent
    public static EndGameDNEvent  analysisEndGameDNEvent (byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);
        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);

        byte[] resultArray = ByteUtils.splitArray(bytes,221,2);
        byte[] missDisArray = ByteUtils.splitArray(bytes,223,8);
        byte[] depFlySecArray = ByteUtils.splitArray(bytes,231,8);


        EndGameDNEvent  build = EndGameDNEvent.builder()
                .timestamp(dateTOString(timestampArray))
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .result(ByteUtils.byteToShort(resultArray))
                .missDis(ByteUtils.getDouble(missDisArray))
                .depFlySec(ByteUtils.getDouble(depFlySecArray))

                .build();
        return build;
    }

    // 37  EndGameCKEvent
    public static EndGameCKEvent  analysisEndGameCKEvent (byte[] bytes) {

        byte[] timestampArray = ByteUtils.splitArray(bytes, 0, 22);
        byte[] cmdIdArray = ByteUtils.splitArray(bytes, 22,37);
        byte[] firingSideIdArray = ByteUtils.splitArray(bytes, 59,37);
        byte[] firingIdArray = ByteUtils.splitArray(bytes,96,37);

        byte[] targetIdArray = ByteUtils.splitArray(bytes, 133,37);
        byte[] munitionIdArray = ByteUtils.splitArray(bytes,170,37);

        byte[] entityTypeArray = ByteUtils.splitArray(bytes,207,14);

        EntityType entityType = analysisEntityType(entityTypeArray);

        byte[] resultArray = ByteUtils.splitArray(bytes,221,2);


        String s = dateTOString(timestampArray);
        EndGameCKEvent  build = EndGameCKEvent.builder()
                .timestamp(s)
                .cmdId(filterCode(ByteUtils.byteArrayToCharArrayToString(cmdIdArray)))
                .firingSideId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingSideIdArray)))
                .firingId(filterCode(ByteUtils.byteArrayToCharArrayToString(firingIdArray)))
                .targetId(filterCode(ByteUtils.byteArrayToCharArrayToString(targetIdArray)))
                .munitionId(filterCode(ByteUtils.byteArrayToCharArrayToString(munitionIdArray)))
                .munitionType(entityType)
                .result(ByteUtils.byteToShort(resultArray))

                .build();
        return build;
    }


    public static Beam analysisBeams(byte[] bytes) {
        Beam beam = new Beam();
        byte[] fAzimuthCenterArray = ByteUtils.splitArray(bytes, 0, 4);
        float fAzimuthCenter = ByteUtils.byteToFloat(fAzimuthCenterArray);
        beam.setFAzimuthCenter(fAzimuthCenter);
        byte[] fAzimuthSweepArray = ByteUtils.splitArray(bytes, 4, 4);
        float fAzimuthSweep = ByteUtils.byteToFloat(fAzimuthSweepArray);
        beam.setFAzimuthSweep(fAzimuthSweep);
        byte[] fElevationCenterArray = ByteUtils.splitArray(bytes, 8, 4);
        float fElevationCenter = ByteUtils.byteToFloat(fElevationCenterArray);
        beam.setFElevationCenter(fElevationCenter);
        byte[] fElevationSweepArray = ByteUtils.splitArray(bytes, 12, 4);
        float fElevationSweep = ByteUtils.byteToFloat(fElevationSweepArray);
        beam.setFElevationSweep(fElevationSweep);
        byte[] fFrequencyArray = ByteUtils.splitArray(bytes, 16, 4);
        float fFrequency = ByteUtils.byteToFloat(fFrequencyArray);
        beam.setFFrequency(fFrequency);
        byte[] fRangeArray = ByteUtils.splitArray(bytes, 20, 4);
        float fRange = ByteUtils.byteToFloat(fRangeArray);
        beam.setFRange(fRange);
        return beam;
    }



    public static String analysisEntityId(byte[] bytes) {

        String a = ByteUtils.byteArrayToCharArrayToString(ByteUtils.splitArray(bytes,0, 37));
        return a;
    }

    public static EntityType analysisEntityType(byte[] bytes) {
        EntityType entityType = new EntityType();
        short kind = ByteUtils.byteToShort(new byte[]{bytes[0], bytes[1]});
        entityType.setKind(kind);
        short domain = ByteUtils.byteToShort(new byte[]{bytes[2], bytes[3]});
        entityType.setDomain(domain);
        short country = ByteUtils.byteToShort(new byte[]{bytes[4], bytes[5]});
        entityType.setCountry(country);
        short category = ByteUtils.byteToShort(new byte[]{bytes[6], bytes[7]});
        entityType.setCategory(category);
        short subcategory = ByteUtils.byteToShort(new byte[]{bytes[8], bytes[9]});
        entityType.setSubcategory(subcategory);
        short specific = ByteUtils.byteToShort(new byte[]{bytes[10], bytes[11]});
        entityType.setSpecific(specific);
        short extra = ByteUtils.byteToShort(new byte[]{bytes[12], bytes[13]});
        entityType.setExtra(extra);
        return entityType;
    }


    public static Vec3D analysisVec3D(byte[] bytes) {
        Vec3D vec3D = new Vec3D();
        byte[] dXArray = ByteUtils.splitArray(bytes, 0, 8);
        double dX = ByteUtils.getDouble(dXArray);
        vec3D.setDX(dX);
        byte[] dYArray = ByteUtils.splitArray(bytes, 8, 8);
        double dY = ByteUtils.getDouble(dYArray);
        vec3D.setDY(dY);
        byte[] dZArray = ByteUtils.splitArray(bytes, 16, 8);
        double dZ = ByteUtils.getDouble(dZArray);
        vec3D.setDZ(dZ);
        return vec3D;
    }

    public static EulerAngle analysisEulerAngle(byte[] bytes) {
        EulerAngle eulerAngle = new EulerAngle();
        double dPsi = ByteUtils.getDouble(new byte[]{bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]});
        eulerAngle.setDPsi(dPsi);
        double dTheta= ByteUtils.getDouble(new byte[]{bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15]});
        eulerAngle.setDTheta(dTheta);
        double dPhi = ByteUtils.getDouble(new byte[]{bytes[16], bytes[17], bytes[18], bytes[19], bytes[20], bytes[21], bytes[22], bytes[23]});
        eulerAngle.setDPhi(dPhi);
        return eulerAngle;
    }

    public static Vec3F analysisVec3F(byte[] bytes) {
        Vec3F vec3F = new Vec3F();
        byte[] fXArray = ByteUtils.splitArray(bytes, 0, 4);
        float fx = ByteUtils.byteToFloat(fXArray);
        vec3F.setFX(fx);
        byte[] fYArray = ByteUtils.splitArray(bytes, 4, 4);
        float fy = ByteUtils.byteToFloat(fYArray);
        vec3F.setFY(fy);
        byte[] fZArray = ByteUtils.splitArray(bytes, 8, 4);
        float fz = ByteUtils.byteToFloat(fZArray);
        vec3F.setFZ(fz);
        return vec3F;
    }

//    得到 MSGHead 类中的 属性： strNum
    public static int analysisMsgHeadStrNum(byte[] bytes){
        return ByteUtils.byteToInt(new byte[]{bytes[16], bytes[17], bytes[18], bytes[19]});
    }

//    解析头文件
    public static MSGHead analysisMsgHead(byte[] bytes){
        MSGHead msgHead = new MSGHead();
        msgHead.setIndex(ByteUtils.byteToInt(ByteUtils.splitArray(bytes, 0, 4)));
        msgHead.setTimeStamp(ByteUtils.byteToLong(ByteUtils.splitArray(bytes,4,8)));
        msgHead.setDateLen(ByteUtils.byteToInt(ByteUtils.splitArray(bytes,12,4)));
        msgHead.setStrNum(ByteUtils.byteToInt(ByteUtils.splitArray(bytes,16,4)));
        return msgHead;
    }
}
